package com.tedu.api.io;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 包位置：java.io
 * RandomAccessFile
 * 专门解决File无法实现读写的操作类【数据传输】，底层使用c 完成
 * 【使用方法并不方便】----知道
 * RandomAccessFile构造器使用("文件路径"，”r代表读，rw代表读写“);
 * RandomAccessFile方法的使用：读，写操作
 * 需求：实现音乐C V 复制  粘贴
 */
public class RandomAccessFileAPI {
    @Test
    public void testWrite() throws IOException {
        //创建RAF类:  在API  项目文件下  直接创建 raf.txt文件，模式:读写
        RandomAccessFile raf
                = new RandomAccessFile("raf.txt", "rw");
        /**
         * write()
         * 作用：写出一个字节，将给定的int值对应2进制的”低8位“写出
         * 该方法有异常，范围：0~255之间--写入ASCII码【接近底层】
         * 出现异常:抛出IO异常---有可能存在文件无法写出的情况
         *
         */
        raf.write(97);//a
        raf.write(98);
        raf.write(101);
        //关闭   流  closed()
        raf.close();
    }

    @Test
    public void testRead() throws IOException {
        //创建RAF类---模式;读
        RandomAccessFile raf
                = new RandomAccessFile("raf.tx" +
                "t", "r");
        /**
         * read()
         * 作用：读取一个字节，返回10进制值【int】
         *     ，如果返回值-1  代表读取末尾
         * 抛出IO异常
         */
        int a = raf.read();
        int b = raf.read();
        int e = raf.readByte();
        int c = raf.read();
        System.out.println("读取到：" + a + " " + b + " " + e + " " + c);
    }

    //需求：实现音乐  C V 复制粘贴
    @Test
    public void testCopy() throws IOException {
        //被复制的文件--复制操作---模式：r
        RandomAccessFile src
                = new RandomAccessFile("小跳蛙.mp3", "r");
        //复制出来的新文件--粘贴操作--模式：rw
        RandomAccessFile desc
                = new RandomAccessFile("新跳娃.mp3", "rw");
        //2.创建变量类型：int类型--1用于保存读取的每个字节
        int temp = -1;  //读取：2读到-1代表文件数据读完了
        //5.【一个一个字节的读----一个字节一个字节写】测运行效率
        long start=System.currentTimeMillis();//系统时间毫秒数
        //3.从"小跳蛙.mp3"---读到每个字节--写出“新跳蛙.mp3”
        //思考：一直从“小跳蛙.mp3”读到所有字节
        //从“小跳蛙.mp3”读到所有字节，只要不是末尾！=—1 一直
        while ((temp = src.read()) != -1) { //如果有数据：true
            //4.写出【新跳蛙.mp3】每个字节
            desc.write(temp);//读入temp数据写出write中

        }
        long end=System.currentTimeMillis();//获取系统时间：毫秒数
        //6关闭流
        src.close();desc.close();
        //7.读取花费时间
        System.out.println("读取花费的时间:"+(end-start)+"毫秒数");
    }
    //需求：实现视频   C  V  复制  粘贴
    /**
     * 读写按照一个字节操作--效率低
     *
     * 1024   程序员节
     * 1 字节=8位二进制
     * 0      0000 0000
     * 1      0000 0001
     * 2      0000 0010
     * 6      0000 0110
     * 1024 字节=1kb
     * 1024kb=1mb
     * 1024mb=1g
     * 1024g=1t
     * 读写按照100kb个字节操作---效率提高
     */
    @Test
    public void testRW() throws IOException {
        //1.被复制的文件---视频--占用内存空间大
        RandomAccessFile src
                = new RandomAccessFile("小跳蛙.mp3", "r");
        //复制出来的新文件新跳蛙
        RandomAccessFile desc
                = new RandomAccessFile("新跳娃.mp3", "rw");
       //2.保存每次读取的字节量
        int len=-1;
        /**重载
         * read()  一个字节一个字节读
         * read(字节数组)   实现根据自己指定的100kb方式读取字节
         *
         */
        //3.定义字节数组---100kb
        byte[] data=new byte[1024*100];
        //4.开始一直从“复制文件.mp4”读取
       // (len=src.read(data))!=-1
        while ((len=src.read(data))!=-1){///////////////
            /**重载
             * write(int i)写出一个字节
             * write(字节数组，读取开始：0，读取结束：-1)
             * 作用：写出“字节数组：指定大小  100kb”
             * 从0开始，读到-1结束
             *
             */
            //5.按照  100kb  写出新跳蛙。MP3
            desc.write(data,0,len);
            //6.关闭流
          //  src.close();desc.close();
            //7.字节测复制的时间
        }
    }
}



















